import redis
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CSRFProtect
from flask_session import Session  # 利用 flask-session扩展，将 session 数据保存到 Redis 中
from flask_script import Manager
from flask_migrate import  Migrate,MigrateCommand

# flask实例对象的初始化
app = Flask(__name__)

# 先在当前类中定义配置的类，并从中加载配置
class Config(object):
    ''' 工程配置信息'''
    DEBUG = True

    # 导入数据库扩展，并在配置中填写相关配置
    # 数据库的配置信息
    # SQLALCHEMY_DATABASE_URI = '数据库类型://账号:密码@数据库IP:数据库端口/数据库名称'
    SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/news_database"
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # 创建redis存储对象，并在配置中填写相关配置
    #redis配置
    REDIS_PORT = 6379
    REDIS_HOST = '127.0.0.1'
    REDIS_DATA_DB = 0
    REDIS_SESSION_DB = 1


    # 设置密钥，可以通过 base64.b64encode(os.urandom(48)) 来生成一个指定长度的随机字符串
    SECRET_KEY = "SNQTyGi1VvWECj9TvC/+kq3oujee2kTfQUs8yCM6xX9Yjq52v54"
    # flask_session 的配置信息
    SESSION_TYPE = "redis"  #指定session保存到redis中
    SESSION_USE_SIGNER = True  # 让 cookie 中的 session_id 被加密签名处理
    SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)  # 使用 redis 的实例
    PERMANENT_SESSION_LIFETIME = 86400  # session 的有效期，单位是秒

# 加载配置类到flask项目中
app.config.from_object(Config)

# 加载配置类到SQLAlchemy项目中
db = SQLAlchemy(app)

# 实例化redis操作对象
redis_store = redis.StrictRedis(host=Config.REDIS_HOST,  port=Config.REDIS_PORT)

# 开启csrf防范机制
CSRFProtect(app)  # (CSRFProtect只做验证工作，cookie中的 csrf_token 和表单中的 csrf_token 需要我们自己实现)

# 启用Session
Session(app)

# 使用终端脚本工具启动和管理flask项目
manager = Manager(app)

# 初始化数据库迁移模块
Migrate(app,db)

# 给终端脚本工具新增数据迁移的相关命令
manager.add_command('db', MigrateCommand)


# 定义视图函数
@app.route("/")
def index():
    return "很棒哦！"

# 运行项目
if __name__ == '__main__':
    # app.run()
    manager.run()